package com.gao.b_stream.e;

import org.junit.Test;

import java.util.stream.IntStream;
import java.util.stream.LongStream;

/**
 * @author gao
 * @time 2020/07/24 17:25:04
 */

// 并行流的使用
public class App {
    // 输出0~99之间的所有数字
    @Test
    public void test() {
        IntStream.range(0, 100)
                .forEach(e -> {
                    System.out.println(Thread.currentThread().getName() + ": " + e);
                });
    }

    // 开启并行Stream，只需在调用终止操作符之前调用parallel()方法即可开启并行计算
    @Test
    public void test2() {
        IntStream.range(0, 20)
                .parallel()
                .forEach(e -> {
                    System.out.println(Thread.currentThread().getName() + ": " + e);
                });
    }

    /*
        对比并行和串行Stream的效率

        先看一下某次的运行结果：

        并行计算：18154
        串行计算：63747
        sum1 = 932356074711512064 sum2 = 932356074711512064
     */
    @Test
    public void test3() {
        //并行计算
        long time = System.currentTimeMillis();
        long sum1 = LongStream.rangeClosed(1, 100000000000l).parallel().sum();
        System.out.println("并行计算：" + (System.currentTimeMillis() - time));
        //串行计算
        time = System.currentTimeMillis();
        long sum2 = LongStream.rangeClosed(1, 100000000000l).sum();
        System.out.println("串行计算：" + (System.currentTimeMillis() - time));

        System.out.println("sum1 = " + sum1 + " sum2 = " + sum2);
    }

    // 并行Stream给开发者带来了极大的便利，一行代码即可开启多线程并行计算，但
    // 是并行计算也要在一定条件下才能使用，比如任务之间不能有依赖、不能存在竞态条件等。
}
